/*
 * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 */
/*
 * Copyright 2002-2004 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.sun.org.apache.xerces.internal.dom;

import java.io.IOException;
import java.io.NotSerializableException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

import com.sun.org.apache.xerces.internal.xs.AttributePSVI;
import com.sun.org.apache.xerces.internal.xs.*;

/**
 * Attribute namespace implementation; stores PSVI attribute items.
 *
 * @author Sandy Gao, IBM
 * @xerces.internal
 */
public class PSVIAttrNSImpl extends AttrNSImpl implements AttributePSVI {

  /**
   * Serialization version.
   */
  static final long serialVersionUID = -3241738699421018889L;

  /**
   * Construct an attribute node.
   */
  public PSVIAttrNSImpl(CoreDocumentImpl ownerDocument, String namespaceURI,
      String qualifiedName, String localName) {
    super(ownerDocument, namespaceURI, qualifiedName, localName);
  }

  /**
   * Construct an attribute node.
   */
  public PSVIAttrNSImpl(CoreDocumentImpl ownerDocument, String namespaceURI,
      String qualifiedName) {
    super(ownerDocument, namespaceURI, qualifiedName);
  }

  /**
   * attribute declaration
   */
  protected XSAttributeDeclaration fDeclaration = null;

  /**
   * type of attribute, simpleType
   */
  protected XSTypeDefinition fTypeDecl = null;

  /**
   * If this attribute was explicitly given a
   * value in the original document, this is true; otherwise, it is false
   */
  protected boolean fSpecified = true;

  /**
   * schema normalized value property
   */
  protected String fNormalizedValue = null;

  /**
   * schema actual value
   */
  protected Object fActualValue = null;

  /**
   * schema actual value type
   */
  protected short fActualValueType = XSConstants.UNAVAILABLE_DT;

  /**
   * actual value types if the value is a list
   */
  protected ShortList fItemValueTypes = null;

  /**
   * member type definition against which attribute was validated
   */
  protected XSSimpleTypeDefinition fMemberType = null;

  /**
   * validation attempted: none, partial, full
   */
  protected short fValidationAttempted = AttributePSVI.VALIDATION_NONE;

  /**
   * validity: valid, invalid, unknown
   */
  protected short fValidity = AttributePSVI.VALIDITY_NOTKNOWN;

  /**
   * error codes
   */
  protected StringList fErrorCodes = null;

  /**
   * validation context: could be QName or XPath expression
   */
  protected String fValidationContext = null;

  //
  // AttributePSVI methods
  //

  /**
   * [schema default]
   *
   * @return The canonical lexical representation of the declaration's {value constraint} value.
   * @see <a href="http://www.w3.org/TR/xmlschema-1/#e-schema_default>XML Schema Part 1: Structures
   * [schema default]</a>
   */
  public String getSchemaDefault() {
    return fDeclaration == null ? null : fDeclaration.getConstraintValue();
  }

  /**
   * [schema normalized value]
   *
   * @return the normalized value of this item after validation
   * @see <a href="http://www.w3.org/TR/xmlschema-1/#e-schema_normalized_value>XML Schema Part 1:
   * Structures [schema normalized value]</a>
   */
  public String getSchemaNormalizedValue() {
    return fNormalizedValue;
  }

  /**
   * [schema specified]
   *
   * @return false value was specified in schema, true value comes from the infoset
   * @see <a href="http://www.w3.org/TR/xmlschema-1/#e-schema_specified">XML Schema Part 1:
   * Structures [schema specified]</a>
   */
  public boolean getIsSchemaSpecified() {
    return fSpecified;
  }


  /**
   * Determines the extent to which the document has been validated
   *
   * @return return the [validation attempted] property. The possible values are NO_VALIDATION,
   * PARTIAL_VALIDATION and FULL_VALIDATION
   */
  public short getValidationAttempted() {
    return fValidationAttempted;
  }

  /**
   * Determine the validity of the node with respect
   * to the validation being attempted
   *
   * @return return the [validity] property. Possible values are: UNKNOWN_VALIDITY,
   * INVALID_VALIDITY, VALID_VALIDITY
   */
  public short getValidity() {
    return fValidity;
  }

  /**
   * A list of error codes generated from validation attempts.
   * Need to find all the possible subclause reports that need reporting
   *
   * @return list of error codes
   */
  public StringList getErrorCodes() {
    return fErrorCodes;
  }

  // This is the only information we can provide in a pipeline.
  public String getValidationContext() {
    return fValidationContext;
  }

  /**
   * An item isomorphic to the type definition used to validate this element.
   *
   * @return a type declaration
   */
  public XSTypeDefinition getTypeDefinition() {
    return fTypeDecl;
  }

  /**
   * If and only if that type definition is a simple type definition
   * with {variety} union, or a complex type definition whose {content type}
   * is a simple thype definition with {variety} union, then an item isomorphic
   * to that member of the union's {member type definitions} which actually
   * validated the element item's normalized value.
   *
   * @return a simple type declaration
   */
  public XSSimpleTypeDefinition getMemberTypeDefinition() {
    return fMemberType;
  }

  /**
   * An item isomorphic to the attribute declaration used to validate
   * this attribute.
   *
   * @return an attribute declaration
   */
  public XSAttributeDeclaration getAttributeDeclaration() {
    return fDeclaration;
  }

  /**
   * Copy PSVI properties from another psvi item.
   *
   * @param attr the source of attribute PSVI items
   */
  public void setPSVI(AttributePSVI attr) {
    this.fDeclaration = attr.getAttributeDeclaration();
    this.fValidationContext = attr.getValidationContext();
    this.fValidity = attr.getValidity();
    this.fValidationAttempted = attr.getValidationAttempted();
    this.fErrorCodes = attr.getErrorCodes();
    this.fNormalizedValue = attr.getSchemaNormalizedValue();
    this.fActualValue = attr.getActualNormalizedValue();
    this.fActualValueType = attr.getActualNormalizedValueType();
    this.fItemValueTypes = attr.getItemValueTypes();
    this.fTypeDecl = attr.getTypeDefinition();
    this.fMemberType = attr.getMemberTypeDefinition();
    this.fSpecified = attr.getIsSchemaSpecified();
  }

  /* (non-Javadoc)
   * @see com.sun.org.apache.xerces.internal.xs.ItemPSVI#getActualNormalizedValue()
   */
  public Object getActualNormalizedValue() {
    return this.fActualValue;
  }

  /* (non-Javadoc)
   * @see com.sun.org.apache.xerces.internal.xs.ItemPSVI#getActualNormalizedValueType()
   */
  public short getActualNormalizedValueType() {
    return this.fActualValueType;
  }

  /* (non-Javadoc)
   * @see com.sun.org.apache.xerces.internal.xs.ItemPSVI#getItemValueTypes()
   */
  public ShortList getItemValueTypes() {
    return this.fItemValueTypes;
  }

  // REVISIT: Forbid serialization of PSVI DOM until
  // we support object serialization of grammars -- mrglavas

  private void writeObject(ObjectOutputStream out)
      throws IOException {
    throw new NotSerializableException(getClass().getName());
  }

  private void readObject(ObjectInputStream in)
      throws IOException, ClassNotFoundException {
    throw new NotSerializableException(getClass().getName());
  }
}
